#if !defined(__CLIENT_H)
#define __CLIENT_H

#include "commun/erreur.h"
#include "reseau/client_reseau.h"
#include "cueilleur_de_touches.h"
#include "interface/surface_image.h"
#include "interface/surface_texte.h"
#include "interface/observateur_evenement.h"
#include "interface/bouton_poussoir.h"
#include "reseau/synchronisation.h"

struct etape0connexion {
	etape0connexion() throw() {
		module_interface::instance().actualiser_affichage();
	}
};

class etape1connexion {
	surface_texte &lbl_pbs_connexion_;
public:
	etape1connexion(surface_texte &l, std::string s) throw() : lbl_pbs_connexion_(l) {
		lbl_pbs_connexion_.texte(s);
		module_interface::instance().actualiser_affichage();
	}
};

class client {
	
	class positionneur_switch_ac {
		client &c_;
	public:
		positionneur_switch_ac(client &c) throw() : c_(c) {}
		void operator()(int x, int y) {
			c_.switch_ac();
		}
	};
	
	bool qwerty_;
	surface_texte lbl_pbs_connexion_;
	cueilleur_de_touches cueilleur_;
	etape0connexion e0_;
	client_reseau client_;
	etape1connexion e1_;
	synchronisation<client_reseau> protocole_sync_;
	etape1connexion e2_;
	surface_image switch_ac_, clavier_azerty_, clavier_qwerty_;
	positionneur_switch_ac pos_sw_ac_;
	bouton_poussoir<positionneur_switch_ac> btn_ac_;
	surface_image img_annuler_;
	bouton_poussoir<> btn_annuler_;
	
public:
	client(std::string adresse) throw(erreur);
	void switch_ac();
};

#endif
